package cxydmmszl.chapter09.t151;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * <li style="color: red;">Prob</li>
 * 折纸问题
 * <li style="color: green;">Desc</li>
 * 请把一张纸条竖着放在桌子上，然后从纸条的下边向上方对折 1 次，压出折痕后展开。
 * 此时折痕是凹下去的，即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折 2 次，
 * 压出折痕后展开，此时有三条折痕，从上到下依次是下折痕、下折痕和上折痕。
 * 给定一个输入参数 N，代表纸条都从下边向上方连续对折 N 次，请从上到下打印所有折痕的方向。
 * <br/><br/>[要求]<br/>
 * 时间复杂度为 O(2^n)，额外空间复杂度为 O(1)
 * <br/><br/>备注：<br/>
 * 1⩽N⩽20
 * <li style="color: green;">Input</li>
 * 第一行一个整数 N。表示对折次数
 * <li style="color: green;">Output</li>
 * 输出若干行，若该折痕向下，输出 "down"，否则输出 "up"。
 * <li style="color: blue;">Link</li> CD60
 *
 * @author habitplus
 * @since 2021-10-17 21:08
 */
public class Main {
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        printAllFolds(n);
    }

    private static void printAllFolds(int n) {
        printFold(1, n, true);
        System.out.println(sb.toString());
    }

    private static void printFold(int i, int n, boolean down) {
        if (i > n) return;

        printFold(i+1, n, true);
//         System.out.println(down ? "down" : "up");
        sb.append(down ? "down\n" : "up\n");
        printFold(i + 1, n, false);
    }
}
